/*********************************************************************************
  *Copyright (c)    2021   xldeng
  *FileName:        25.cpp.c
  *Author:          xldeng
  *Version:         1.0
  *Date:            2021/2/14 19:45
  *Description:     
  *Others:          
  *Function List:   
     1.…………
  *History:  
     1.Date:
       Author:
       Modification:
**********************************************************************************/
//给你一个链表，每k个节点一组进行翻转，请你返回翻转后的链表。
//
//k是一个正整数，它的值小于或等于链表的长度。
//
//如果节点总数不是k的整数倍，那么请将最后剩余的节点保持原有顺序。
#include "../header.h"
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (head == nullptr) return nullptr;
        ListNode *a,*b;
        a = b = head;
        for (int i = 0; i < k; ++i) {
            if (b == nullptr) return head;
            b = b->next;
        }
        ListNode *newHead = reverse(a,b);
        a->next = reverseKGroup(b,k);
        return newHead;
    }

    ListNode *reverse(ListNode *a,ListNode *b){ // 反转[a,b)
        ListNode *pre = nullptr;
        ListNode *cur = a;
        ListNode *next = a;
        while (cur != b){
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        // 返回逆转后的头节点
        return pre;
    }
};
